package com.常用类.String;

/**
 * 作    者 ：吾路巴尼
 * 创建时间 ：2025/2/23-21:54
 */
public class StringExercise01 {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = new String("hello");
        System.out.println(str1 == str2);  //false，因为str1是常量池中的对象，str2是堆内存中的对象
        System.out.println(str1.equals(str2));//str1和str2的值相同，所以输出true

        /**str2.intern()返回的是常量池中的地址；（对象的）
         * 即：返回str2最终保存"hello"这个字符串存放的地址*/
        System.out.println(str1 == str2.intern());
        //str1指向常量池中的hello，str2.intern()返回的是最终保存在常量池中hello的地址，所以输出true
        System.out.println(str2 == str2.intern());
        //注意：str2是new出来的在堆上的对象，而str2.intern()返回的是常量池中的地址，所以false

        System.out.println("======================================");
        String str3 = "Hello"+"World";
        /**编译器会将"Hello"+"World"直接优化为"HelloWorld"再去常量池找有没有，如果有就直接将str3指向该字符串，如果没有就创建一个"HelloWorld"，再返回该地址。
         */
        System.out.println("=======================================");
        String s1 = "w";
        String s2 = "ps";
        String s3 = s1+s2;//韩顺平470
        /**  1.创建Builder对象，调用append方法，将s1和s2拼接，
         * Builder builder = new StringBuilder(); //builder对象现在是空；
         * builder.append(s1);  //builder对象中拼接s1==》变成"w"；
         * builder.append(s2);  //builder对象中拼接s2==》变成"wps"；
         * 再调用toString方法，返回一个字符串，并赋值给s3；
         * s3 = builder.toString(); //返回new String("wps")，并返回地址；
         * 相当于：
         * builder拼接了s1和s2，然后创建对象返回给s3；
         * 即：s3指向堆空间里new的对象，对象再指向常量池中的"wps"；
         *
         */
    }
}
